class CustomError extends Error{
    constructor(err, actionName) {
        super()
        this.name = "CustomError"; //错误类型
        this.actionName = actionName; //调用函数名
        this.errMsg = ""; //错误信息
        this.errCode = -1; //错误编码
        this._reset(err);
    }
    /*
    * 重置错误数据
    * */
    _reset (err) {
        let {actionName} = err,
            currentActionName = this.actionName;
        switch (true) {
            case this._isType("Object")(err): //普通对象实例
                Object.assign(this, err);
                this.actionName = actionName ? (currentActionName ? actionName + " ---> " + currentActionName : "") : currentActionName;
                break;
            case this._isType("Error")(err):  //Error对象实例
                this.name = err.name;
                this.actionName = actionName ? (currentActionName ? actionName + " ---> " + currentActionName : "") : currentActionName;
                this.errMsg = err.message || err.errMsg;
                this.errCode = err.errorCode || err.errCode; //错误编码
                this.stack = err.stack;
                break
            default:
                this.errMsg = err
                break
        }
    }
    /*
    * 类型检测
    * */
    _isType (type) {
        return function (data) {
            return Object.prototype.toString.call(data) === "[object " + type + "]"
        }
    }
    parse () { //返回对象
        return {
            name: this.name,
            actionName: this.actionName,
            errMsg: this.errMsg,
            errCode: this.errCode
        }
    }
}

module.exports = CustomError